﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 数据转换小王子
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }


        //完成HEX也就是byte 到char 的形式转化 以供显示
       // #region byteHEX
        public static String byteHEX(Byte ib)
        {
            String str1 = String.Empty;
            String str2 = String.Empty;
            str1 = "0X";
            try
            {
                char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };
                char[] ob = new char[2];
                ob[0] = Digit[(ib >> 4) & 0X0F];
                ob[1] = Digit[ib & 0X0F];
                str2 = new String(ob);
            }
            catch (Exception)
            {
                new Exception("对不起有错。");
            }
            str1 += str2;
            str1 += ",";
            return str1;

        }
        //#endregion
       
        //完成ASCII的char 变成hex  只能是0--9 a--f A--F 其他统一返回0
        //它不客观正确
        public static byte GetHexBitsValue(char ch)
        {
            byte hex = 0;
            if (ch <= '9' && ch >= '0')
                hex = (byte)(ch - 0x30);//char ['0'--'9'] 就是-‘0’
            if (ch <= 'F' && ch >= 'A')
                hex = (byte)(ch - 0x37);//char ['A'--'F'] 就是-‘A’
            if (ch <= 'f' && ch >= 'a')
                hex = (byte)(ch - 0x57);//char ['a'--'f'] 就是-‘a’

            return hex;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string Inputstring = richTextBox1.Text;//标识来料的string
            int Inputstring_len = richTextBox1.Text.Length;//标识来料的string长度
            char[] Inputstring_char = new char[Inputstring_len];// 标识来料的string对应的一个个char
            byte[] Inputstring_byte = new byte[Inputstring_len];// 标识来料的string对应转化成的的一个个byte也就是hex
            if (Inputstring_len < 1) { richTextBox2.Text = "No Input"; }
            else
            {
            richTextBox2.Text = "";
            for (int i = 0; i < Inputstring_len; i++)
                Inputstring_char[i] = Inputstring[i];//没什么意义 一个一个char
            for (int i = 0; i < Inputstring_len; i++)
                    //非常重要 每个char转成byte 也就是真正的精髓 
                    //比如char‘1’它就是0X31,比如%d%c结果就是这样
                    //char ch='d';
                   // printf("%d--%c\n", ch, ch);// 100--d
                   //内存中其实都是100来保存的 没有所谓的d 这就是ASCII码的意义 字符和byte一一对应 其他的还有GB2312 UNCODE等对应表
                   //它客观 正确
                Inputstring_byte[i] = (byte)(Inputstring_char[i]);// GetHexBitsValue(Inputstring_char[i]);--他不正确 它是业务上的比如‘1’就是1 这样约定的

            String Outputtring = String.Empty;
            for (int i = 0; i < Inputstring_len; i++)//上面已经转好了byte也就是hex 为了显示出来 不要在强转char了 我们让他好看一点
                Outputtring += byteHEX(Inputstring_byte[i]);

            richTextBox2.Text = Outputtring.Substring(0, Outputtring.Length-1);//丢弃最后一个，
            }

                  
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string Inputstring = richTextBox2.Text.Trim();//标识来料的string
            while (Inputstring.Contains(" ") | Inputstring.Contains("-") | Inputstring.Contains(","))
            {
                Inputstring = Inputstring.Replace(" ", "");/*去空格*/
                Inputstring = Inputstring.Replace("-", "");
                Inputstring = Inputstring.Replace(",", "");
            }

            int Inputstring_len = Inputstring.Length;//标识来料的string长度
            char[] Inputstring_char = new char[Inputstring_len];// 标识来料的string对应的一个个char
            byte[] Inputstring_byte = new byte[Inputstring_len];// 标识来料的string对应转化成的的一个个byte也就是hex
            byte[] Outputstring_byte = new byte[Inputstring_len/2];//上面的数组两两组合 准备出去
            char[] Outputstring_char = new char[Inputstring_len/2];//上面的数组两两组合 准备出去
            if (Inputstring_len < 1) { richTextBox1.Text = "No Input"; }
            else if (Inputstring_len % 2 != 0) { richTextBox1.Text = "Not Even numbers"; }
            else
            {
                richTextBox1.Text = "";
                textBox2.Text  = Inputstring_len.ToString();//比较方便哦
                for (int i = 0; i < Inputstring_len; i++)
                    Inputstring_char[i] = Inputstring[i];//没什么意义 一个一个char
                for (int i = 0; i < Inputstring_len; i++)
                    Inputstring_byte[i] = GetHexBitsValue(Inputstring_char[i]);//有意义 完成不正确强转

                for (int i = 0; i < Inputstring_len / 2 ; i++)//bug: 现在是两两组合呀
                    Outputstring_byte[i] = (byte)(Inputstring_byte[2*i] * 16 + Inputstring_byte[2*i + 1]);
                for (int i = 0; i < Inputstring_len / 2; i++)
                    Outputstring_char[i] = (char)Outputstring_byte[i];//一个一个char


                String Outputtring = String.Empty;
                for (int i = 0; i < Inputstring_len/2; i++)
                    Outputtring += Outputstring_char[i];

                richTextBox1.Text = Outputtring;
            }
        }
    }
}
